package com.wnzt.baszh.core.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

import com.wnzt.baszh.util.common.PageHelper;

/**
 * 基础平台业务层数据库操作接口
 * 
 * @version [版本�? 2013-7-11 上午11:11:04]
 */
public interface ICommonService {
    /**
     * 删除实体
     * 
     * @param entity
     *            �?��删除的实�?
     * @return void [返回类型说明]
     */
    public void delete(BaseModel entity)throws Exception;

    /**
     * 更新操作:支持持久化状态下更新
     * 
     * @param entity
     *            �?��修改的实�?
     * @return void [返回类型说明]
     */
    public void update(BaseModel entity)throws Exception;

    /**
     * 批量新增和修�?
     * 
     * @param entityList
     *            [参数说明]
     * @return void
     * @exception throws [违例类型] [违例说明]
     */
    public void saveOrUpdateList(List<?> entityList)throws Exception;

    /**
     * 
     * 更新操作:支持脱管状�?下更�?
     * 
     * @param model
     *            [参数说明]
     * @return void
     * @exception throws [违例类型] [违例说明]
     */
    public void merge(BaseModel entity)throws Exception;

    /**
     * 根据主键ID删除
     * 
     * @param id
     *            主键ID
     * @return void [返回类型说明]
     */
    public void deleteById(Class<?> c, Serializable id)throws Exception;
    
    /**
     * 根据主键ID软删�?
     * 
     * @param id
     *            主键ID
     * @return void [返回类型说明]
     */
    public void updateDeleteFlagById(Class<?> c, Serializable id)throws Exception;

    /**
     * 批量删除
     * 
     * @param entityList
     *            [参数说明]
     * @return void
     * @exception throws [违例类型] [违例说明]
     */
    public void deleteList(List<?> entityList)throws Exception;

    /**
     * 保存实体对象并返回数据库中的主键
     * 
     * @param entity
     *            要保存的实体对象
     * @return 保存数据的主�?
     * @return Serializable [返回类型说明]
     */
    public Serializable save(BaseModel entity)throws Exception;

    /**
     * 保存或修�?不明确操作是保存还是修改时使用此方法
     * 
     * @param entity
     *            操作对象
     * @return void [返回类型说明]
     */
    public void saveOrUpdate(BaseModel entity)throws Exception;

    /***
     * 执行Update或Delete的HQL语句
     * 
     * @param hql
     * @param params
     * @return [参数说明]
     * @return int [返回类型说明]
     */
    public int executeHql(String hql, Object... params)throws Exception;

    /**
     * 执行原生SQL（insert,update)
     * 
     * @param sql
     *            sql语句
     * @param values
     *            条件参数
     * @return void [返回类型说明]
     */
    public void executeSQL(String sql, Object... values)throws Exception;

    /**
     * HQL查询
     * 
     * @param hql
     *            hql语句
     * @param params
     *            传入参数 可为null
     * @return [参数说明]
     * @return List<T> [返回类型说明]
     */
    public List<?> findByHQL(String hql, Object... params);

    /**
     * 原生SQL查询
     * 
     * @param sql
     *            sql语句
     * @param params
     *            参数�?可为�?
     * @return [参数说明]
     * @return List [返回类型说明]
     */
    public List<?> findBySQL(String sql, Object... params);

    /**
     * QBC查询
     * 
     * @param detachedCriteria
     * @return List [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类�?�?方法、类#成员]
     */
    public List<?> findByQBC(DetachedCriteria detachedCriteria);

    /**
     * 
     * HQL分页查询
     * 
     * @param queryObject
     * @return Page [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类�?�?方法、类#成员]
     */
    public Page findPageByHQL(QueryObject queryObject);

    /**
     * 原生SQL分页查询
     * 
     * @param queryObject
     * @return Page [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类�?�?方法、类#成员]
     */
    public Page findPageBySQL(QueryObject queryObject);

    /**
     * 
     * QBC分页查询
     * 
     * @param queryObject
     * @return Page [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类�?�?方法、类#成员]
     */
    public Page findPageByQBC(QueryObject queryObject);

    /**
     * 分页查询数据，支持QBC、HQL、SQL
     * 
     * @param queryType
     *            查询类型 [ConstantsStatic.QUERY_TYPE_QBC/ConstantsStatic.QUERY_TYPE_HQL/ConstantsStatic.QUERY_TYPE_SQL/ConstantsStatic.QUERY_PROC_SQL]
     * @param queryObject
     *            查询对象
     * @return 符合查询条件的数�?
     */
    public Page findPage(int queryType, QueryObject queryObject);

    /**
     * 根据主键获得对象
     * 
     * @param clazz
     * @param id
     * @return [参数说明]
     * @return T [返回类型说明]
     */
    public BaseModel get(Class<?> c, Serializable id);

    /**
     * 查询单个对象 根据DetachedCriteria对象返回符条件的单个对象
     * 
     * @param detachedCriteria
     * @return [参数说明]
     * @return T [返回类型说明]
     */
    public BaseModel find(DetachedCriteria detachedCriteria);

    /**
     * 根据HQL查询满足该SQL的对�?
     * 
     * @param hql
     *            hql语句
     * @param params
     *            条件参数，可为null
     * @return [参数说明]
     * @return T [返回类型说明]
     */
    public BaseModel find(String hql, Object... params);

    /**
     * 根据HQL获得查询结果的行�?
     * 
     * @param queryObject
     * @return [参数说明]
     * @return Long [返回类型说明]
     */
    public Long getCountByHQL(QueryObject queryObject);

    /**
     * 根据QBC获得查询结果的行�?
     * 
     * @param detachedCriteria
     * @return [参数说明]
     * @return Long [返回类型说明]
     */
    public Long getCountByQBC(DetachedCriteria detachedCriteria);

    /**
     * 根据原生SQL获得查询结果行数（在HQL、QBC满足�?��的情况，不建议使用此方法�?
     * 
     * @param queryObject
     * @return [参数说明]
     * @return Long [返回类型说明]
     */
    public Long getCountBySQL(final QueryObject queryObject);

    /**
     * 将session的缓存中的数据与数据库同�?
     * 
     * @return void
     * @exception throws [违例类型] [违例说明]
     */
    public void flush();

    /**
     * 清除session中的缓存数据（不管缓存与数据库的同步�?
     * 
     * @return void
     * @exception throws [违例类型] [违例说明]
     */
    public void clear();

    /**
     * 调用执行存储过程
     * 
     * @param queryObject
     * @param map
     *            输出参数据定�?key:index�?value:类型
     * @return [参数说明]
     * @exception throws [违例类型] [违例说明]
     */
    public List<?> findListByProc(final QueryObject queryObject, final Map<Integer, Integer> map)throws Exception;

    /**
     * 
     * 获取主键标识�?返回对应int(32)或bigInt(64)
     * 
     * @param tableName
     *            表名
     * @param isBigInt
     *            是否返回bigInt�?true:返回bigInt(64) false:返回int(32)
     * @return [参数说明]
     * @return Long
     * @exception throws [违例类型] [违例说明]
     */
    public Long getIntID(String tableName, boolean isBigInt);

    /**
     * 根据主键查询是否存在对应数据
     * 
     * @param id
     * @return true:存在 false:不存�?
     * @return boolean
     * @exception throws [违例类型] [违例说明]
     */
    public boolean exists(Class<?> c, Serializable id);
    
    /**
     * 获取当前数据库操作session对象
     * @return [参数说明]
     * @return Session 
     * @exception throws [违例类型] [违例说明]
     */
    public Session getCurrentSession();
    
    public PageHelper queryMssqlSplitPageByProc(String columns, String tablenames, String whereCondition, String orderColumns, int isOrderByAsc, String keyword, int currentPage, int pageSize);

}

